Avoid creating trivial shadow nodes
authorMatthias Clasen <mclasen@redhat.com>
Sat, 28 Oct 2017 20:10:46 +0000 (16:10 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 28 Oct 2017 20:10:46 +0000 (16:10 -0400)
The Vulkan renderer creates a fallback surface for each shadow
node, even if we end up not rendering anything to it. Avoiding
this is a nice optimization.

gtk/gtkcssshadowsvalue.c
gtk/gtkcssshadowsvalueprivate.h
gtk/gtkcssshadowvalue.c
gtk/gtkcssshadowvalueprivate.h
gtk/gtkrendericon.c
gtk/gtksnapshot.c

index bd687dc156cebe555f43bc01374924a0d4e7531f..fcb6097ceafa775ce7a07a017ccd292a3e7ce6d3 100644 (file)
@@ -24,6 +24,7 @@
 #include <math.h>
 
 #include "gtkcssshadowvalueprivate.h"
+#include "gtksnapshot.h"
 
 #include <string.h>
 
@@ -393,3 +394,29 @@ _gtk_css_shadows_value_get_extents (const GtkCssValue *shadows,
 
   *border = b;
 }
+
+gboolean
+gtk_css_shadows_value_push_snapshot (const GtkCssValue *value,
+                                     GtkSnapshot       *snapshot)
+{
+  gboolean need_shadow = FALSE;
+  int i;
+
+  for (i = 0; i < value->len; i++)
+    {
+      if (!gtk_css_shadow_value_is_clear (value->values[i]))
+        {
+          need_shadow = TRUE;
+          break;
+        }
+    }
+
+  if (need_shadow)
+    {
+      GskShadow *shadows = g_newa (GskShadow, value->len);
+      gtk_css_shadows_value_get_shadows (value, shadows);
+      gtk_snapshot_push_shadow (snapshot, shadows, value->len, "Shadow<%u>", value->len);
+    }
+
+  return need_shadow;
+}
index be2f6b497fe52e13e7a211eac0cf7651af6ccd8b..5bd78615f401fa297adbf2daf67d5893611f646c 100644 (file)
@@ -61,6 +61,8 @@ void            gtk_css_shadows_value_snapshot_inset  (const GtkCssValue
 
 void            _gtk_css_shadows_value_get_extents    (const GtkCssValue        *shadows,
                                                        GtkBorder                *border);
+gboolean        gtk_css_shadows_value_push_snapshot   (const GtkCssValue        *shadows,
+                                                       GtkSnapshot              *snapshot);
 
 G_END_DECLS
 
index 3c7d1160cb49e1163baaa45082d3706a316f992e..c5f1db47b8f45f5a6853a71402d0ad75c2a0d349 100644 (file)
@@ -1090,3 +1090,9 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue   *shadow,
   gsk_render_node_unref (node);
 }
 
+gboolean
+gtk_css_shadow_value_is_clear (const GtkCssValue *shadow)
+{
+  return gdk_rgba_is_clear (_gtk_css_rgba_value_get_rgba (shadow->color));
+}
+
index 2c139c86e8f8c26322568d858ba5cb0d40f17f5c..e3113d106a8aff3ebe258dc148932bb0cc99c52a 100644 (file)
@@ -59,6 +59,8 @@ void            gtk_css_shadow_value_snapshot_inset   (const GtkCssValue
                                                        GtkSnapshot              *snapshot,
                                                        const GskRoundedRect     *padding_box);
 
+gboolean        gtk_css_shadow_value_is_clear         (const GtkCssValue        *shadow);
+
 G_END_DECLS
 
 #endif /* __GTK_SHADOW_H__ */
index b028d7722e604231852a93773b5c1f6711469696..a500db8fbbb678f19c5cce7e690e628c2eb895b6 100644 (file)
@@ -99,8 +99,7 @@ gtk_css_style_snapshot_icon (GtkCssStyle            *style,
   const GtkCssValue *shadows_value, *transform_value, *filter_value;
   graphene_matrix_t transform_matrix;
   GtkCssImage *image;
-  GskShadow *shadows;
-  gsize n_shadows;
+  gboolean has_shadow;
 
   g_return_if_fail (GTK_IS_CSS_STYLE (style));
   g_return_if_fail (snapshot != NULL);
@@ -121,13 +120,7 @@ gtk_css_style_snapshot_icon (GtkCssStyle            *style,
 
   gtk_css_filter_value_push_snapshot (filter_value, snapshot);
 
-  n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
-  if (n_shadows > 0)
-    {
-      shadows = g_newa (GskShadow, n_shadows);
-      gtk_css_shadows_value_get_shadows (shadows_value, shadows);
-      gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
-    }
+  has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
 
   if (graphene_matrix_is_identity (&transform_matrix))
     {
@@ -150,9 +143,9 @@ gtk_css_style_snapshot_icon (GtkCssStyle            *style,
       gtk_snapshot_pop (snapshot);
     }
 
-  if (n_shadows > 0)
+  if (has_shadow)
     gtk_snapshot_pop (snapshot);
-  
+
   gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
 }
 
@@ -282,8 +275,7 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle       *style,
   graphene_matrix_t transform_matrix;
   graphene_rect_t bounds;
   double width, height;
-  GskShadow *shadows;
-  gsize n_shadows;
+  gboolean has_shadow;
 
   g_return_if_fail (GTK_IS_CSS_STYLE (style));
   g_return_if_fail (snapshot != NULL);
@@ -301,13 +293,7 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle       *style,
 
   gtk_css_filter_value_push_snapshot (filter_value, snapshot);
 
-  n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
-  if (n_shadows > 0)
-    {
-      shadows = g_newa (GskShadow, n_shadows);
-      gtk_css_shadows_value_get_shadows (shadows_value, shadows);
-      gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "IconShadow<%zu>", n_shadows);
-    }
+  has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
 
   if (color_matrix)
     gtk_snapshot_push_color_matrix (snapshot, color_matrix, color_offset, "Recoloring Icon");
@@ -339,8 +325,8 @@ gtk_css_style_snapshot_icon_texture (GtkCssStyle       *style,
   if (color_matrix)
     gtk_snapshot_pop (snapshot);
 
-  if (n_shadows > 0)
+  if (has_shadow)
     gtk_snapshot_pop (snapshot);
-  
+
   gtk_css_filter_value_pop_snapshot (filter_value, snapshot);
 }
index d9d463a99c465162acd19d7733b2f0d6bb2c6baf..4af505e259fd678e7ed240bee12e0ad39289d915 100644 (file)
@@ -1460,8 +1460,7 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
 {
   const GdkRGBA *fg_color;
   GtkCssValue *shadows_value;
-  GskShadow *shadows;
-  gsize n_shadows;
+  gboolean has_shadow;
 
   g_return_if_fail (snapshot != NULL);
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
@@ -1472,18 +1471,11 @@ gtk_snapshot_render_layout (GtkSnapshot     *snapshot,
   fg_color = _gtk_css_rgba_value_get_rgba (_gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR));
 
   shadows_value = _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_TEXT_SHADOW);
-  n_shadows = gtk_css_shadows_value_get_n_shadows (shadows_value);
-
-  if (n_shadows > 0)
-    {
-      shadows = g_newa (GskShadow, n_shadows);
-      gtk_css_shadows_value_get_shadows (shadows_value, shadows);
-      gtk_snapshot_push_shadow (snapshot, shadows, n_shadows, "TextShadow<%zu>", n_shadows);
-    }
+  has_shadow = gtk_css_shadows_value_push_snapshot (shadows_value, snapshot);
 
   gsk_pango_show_layout (snapshot, fg_color, layout);
 
-  if (n_shadows > 0)
+  if (has_shadow)
     gtk_snapshot_pop (snapshot);
 
   gtk_snapshot_offset (snapshot, -x, -y);